// Package main 提供了一个使用 Gin 框架处理参数校验的 Web 服务器示例
// 演示了如何使用 binding 标签对请求参数进行校验
package main

import (
	"github.com/gin-gonic/gin" // 导入 Gin Web 框架
)

// RunParamValidationServer 初始化 Gin 路由器，注册处理参数校验的路由，启动 Web 服务器
// 演示了如何使用 binding 标签对请求参数进行校验
func RunParamValidationServer() {
	// 创建默认的 Gin 路由器实例
	// 包含 Logger 和 Recovery 中间件
	// Logger 中间件用于记录请求日志
	// Recovery 中间件用于从 panic 中恢复并返回 500 错误
	r := gin.Default()

	// 注册路由：POST 请求 "/json" 路径处理带校验的 JSON 参数
	r.POST("/json", func(c *gin.Context) {
		// 定义 User 结构体，用于接收并校验 JSON 参数
		// 使用 json 标签指定字段对应的 JSON 字段名
		// 使用 binding 标签指定校验规则
		type User struct {
			// Name 字段要求必填，最小长度为3，最大长度为8
			Name string `json:"name" binding:"required,min=3,max=8"`
			Age  int    `json:"age"` // Age 字段无特殊校验要求
		}

		// 声明 User 结构体变量
		var user User

		// 使用 ShouldBindJSON 方法将 JSON 参数绑定到 user 结构体
		// 同时进行参数校验，如果校验失败，err 包含错误信息
		err := c.ShouldBindJSON(&user)

		// 检查参数校验是否失败
		if err != nil {
			// 如果校验失败，返回错误信息给客户端
			// 使用 c.String 方法返回纯文本响应，状态码为 200
			c.String(200, err.Error())
			return
		}

		// 如果校验成功，返回解析后的用户数据
		// 使用 c.JSON 方法返回 JSON 格式响应，状态码为 200
		c.JSON(200, user)
	})

	// 启动 HTTP 服务器，监听 8000 端口
	// 如果启动失败，会返回一个 error 类型的错误信息
	if err := r.Run(":8000"); err != nil {
		// 使用 panic 输出启动失败的错误信息
		panic(err)
	}
}
